/**
 *	Autor:          Grupo 3 -- Gabriela Azcona + Martin Cura
 *	Fecha:          sep/oct 2013
 *	Comentarios:    Parte del TP2 (Grupal) de Algoritmos y Programación II [75.41]
 *
 *  Tipo de dato abstracto para tratar con archivos versionados.
 *  Estructura el formato de estos y permite accederlos, modificarlos, eliminarlos.
 **/

#ifndef TVA_H_INCLUDED
#define TVA_H_INCLUDED
#if !defined(MAX_LINEA)
		#define MAX_LINEA 300
	#endif

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "Lista.h"
#include "Pila.h"
#include "Cola.h"


typedef struct {
    char* ruta;                 /* ruta al archivo versionado */
    TListaSimple revisiones;    /* historial de cambios */
} TAV;

typedef struct {
    int num;                    /* número de revisión */
    TCola cambios;              /* cambios realizados en esta revisión */
    /*info_revision_t info;*/   /* Info administrativa de la revisión */
} revision_t;

typedef enum { TAV_INSE, TAV_ELIM } tipo_cambio_t;

typedef struct {
    tipo_cambio_t tipo;         /* inserción o eliminación de una línea */
    int pos;                    /* ubicación de la línea */
    char texto[MAX_LINEA];      /* contenido de la línea */
} cambio_t;

typedef struct {
    char* comentario;
    char* fecha;
} info_revision_t;


int TAV_Abrir (TAV*, const char*);
/**
 *  FUNCIÓN	Abre un archivo para gestionar su historial de versiones.
 *  PRE     tav tiene suficiente memoria reservada para una estructura de tipo TAV. ruta es la ruta al archivo, alocada y terminada en \0.
 *  POST	Si el archivo existe y está versionado, lo abre y devuelve 0. Si el archivo existe y no está versionado,
 *          inicializa la funcionalidad de versionado y devuelve 1. Si hubo algún error devuelve -1.
 */

int TAV_Cerrar (TAV*);
/**
 *  FUNCIÓN	Cierra el archivo tav.
 *  PRE     tav abierto.
 *  POST	Archivo cerrado. Retorna 0 si el archivo se cerró satisfactoriamente, -1 si ocurrió algún error.
 */

int TAV_Liberar (TAV*);
/**
 *  FUNCIÓN	Quita la funcionalidad de versionado al archivo tav.
 *  PRE     tav abierto.
 *  POST	Si devuelve 0, estructuras de control eliminadas y tav cerrado. Si devuelve -1 ocurrió algún error.
 */

int TAV_Actualizar (TAV*, char*);
/**
 *  FUNCIÓN	Actualiza el historial a la versión actual del archivo.
 *  PRE     tav abierto.
 *  POST	Historial actualizado. Devuelve el número de revisión (entero mayor que cero) o -1 si ocurrió algún error.
 */

int TAV_Deshacer (TAV*, int);
/**
 *  FUNCIÓN	Recupera la revisión rev del archivo.
 *  PRE     tav abierto.
 *  POST	Si devuelve 0 se recuperó la revisión rev del archivo.
 *          Si devuelve -1 no existe la revisión rev. Si devuelve -2 ocurrió otro error. Se conserva el historial intacto.
 */

int TAV_GetInfoRevision (const TAV*, int, info_revision_t*);
/**
 *  FUNCIÓN	Lee el comentario y la fecha de la revisión rev del archivo.
 *  PRE     tav abierto. info tiene memoria reservada para una estructura de tipo info_revision_t.
 *  POST	Si devuelve 0 devolvió en coment el comentario y en fecha la fecha de la revisión rev del archivo.
 *          Si devuelve -1 no existe la revisión rev. Si devuelve -2 ocurrió otro error.
 */

int TAV_GetListaRevisiones (const TAV*, TListaSimple*);
/**
 *  FUNCIÓN	Lee el comentario y la fecha de todas las revisiones del archivo.
 *  PRE     tav abierto. info apunta a una lista simple creada y vacía para contener objetos de tipo info_revision_t.
 *  POST	Si devuelve 0 devolvió en info una lista de objetos info_revision_t con los datos de cada una de las revisiones del archivo.
 *          Si devuelve -1 ocurrió un error y la lista permanece inalterada.
 */


#endif
